package com.jrx.anytxn.customer.mapper.ext;


import com.jrx.anytxn.common.annotation.EnableHistoryLogAnnotation;
import com.jrx.anytxn.customer.entity.CmCustomerFirstLevel;
import com.jrx.anytxn.customer.entity.CmCustomerSecondLevel;
import com.jrx.anytxn.customer.mapper.base.CmCustomerSecondLevelMapper;
import org.apache.ibatis.annotations.Param;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 客户二级表的自定义扩展接口
 *
 * @author Qingyao Xing
 * @date 2019/9/27 15:11
 */
public interface ExtCmCustomerSecondLevelMapper extends CmCustomerSecondLevelMapper {


    /**
     * 根据客户ID和渠道号查询客户信息
     *
     * @param userId   用户id
     * @param channel  渠道
     * @param tenantId 租户id
     * @return CmCustomerSecondLevel 客户二级表实体
     */
    CmCustomerSecondLevel selectByUserIdAndChannel(@Param("userId") String userId, @Param("channel") String channel, @Param("tenantId") String tenantId);

    /**
     * 根据渠道id、用户user_id、手机号、客户id判断渠道在客户二级信息表中是否已存在该客户记录
     *
     * @param channel  渠道
     * @param userId   用户id
     * @param mobile   手机号
     * @param tenantId 租户id
     * @return CmCustomerSecondLevel 客户二级表信息
     */
    CmCustomerSecondLevel selectBySecondLevel(@Param("channel") String channel, @Param("userId") String userId, @Param("mobile") String mobile, @Param("tenantId") String tenantId);

    /**
     * 根据渠道id、用户user_id、手机号判断渠道在客户二级信息表中是否已存在该客户记录数量
     *
     * @param channel  渠道
     * @param userId   用户id
     * @param mobile   手机号
     * @param tenantId 租户id
     * @return 符合条件的客户二级表中数据的数目
     */
    int selectBySecondLevelCount(@Param("channel") String channel, @Param("userId") String userId, @Param("mobile") String mobile, @Param("tenantId") String tenantId);

    /**
     * 修改账单日信息
     *
     * @param customerId     用户ID
     * @param organizationId 机构ID
     * @param channel        渠道号
     * @param statementDd    账单日
     * @param tenantId       租户id
     * @return int
     * @author: fan.yang
     * @date: 2019/9/25 0025 下午 14:04
     */
    int updateStatementDd(@Param("customerId") String customerId, @Param("organizationId") String organizationId, @Param("channel") String channel, @Param("statementDd") Integer statementDd, @Param("tenantId") String tenantId);

    /**
     * 根据条件查询二级客户表
     *
     * @param cond 查询条件
     * @return 二级表数据
     */
    List<CmCustomerSecondLevel> selectByCondition(CmCustomerSecondLevel cond);

    /**
     * 根据电话查询客户二级表基本数据
     *
     * @param mobile   手机号
     * @param tenantId 租户id
     * @return 基本信息
     */
    ArrayList<CmCustomerSecondLevel> selectCustomerSecondLevelByTenanIdAndMobile(@Param(value = "mobile") String mobile, @Param("tenantId") String tenantId, @Param("userId") String userId);

    /**
     * 根据主键、客户id、租户id修改客户二级信息
     *
     * @param cmCustomerSecondLevel 客户二级信息
     * @return 生效个数
     */
    @EnableHistoryLogAnnotation
    int updateByIdAndCustomerIdAndTenantId(CmCustomerSecondLevel cmCustomerSecondLevel);

    /**
     * 根据租户id和客户id集合查询客户二级表信息
     *
     * @param tenantId
     * @param customerIdList
     * @return
     */
    List<CmCustomerSecondLevel> selectCustomerSecondLevelByTenanIdAndCustomerIdList(@Param("tenantId") String tenantId, @Param("customerIdList") List<String> customerIdList);

    /**
     * 根据开始时间和结束时间查询客户二级表信息
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<CmCustomerSecondLevel> selectByUpdateTimeSelective(@Param("startTime") String startTime, @Param("endTime") String endTime);

    CmCustomerSecondLevel selectByCustomerIdAndChannel(@Param("customerId") String customerId, @Param("channel") String channel, @Param("tenantId") String tenantId);


    CmCustomerSecondLevel selectByIdAndCustomerId(@Param("id") Long id,
                                                  @Param("tenantId") String tenantId,
                                                  @Param("customerId") String customerId);


    List<CmCustomerSecondLevel> selectByUpdateTime(@Param("startTime") String startTime);

    /**
     * 统计客户二级信息的数量
     *
     * @return int
     */
    int selectCountForBatch();


    CmCustomerSecondLevel selectByChannelAndMobileAndTenantId(@Param("channel") String channel, @Param("mobile") String mobile, @Param("tenantId") String tenantId);


    List<CmCustomerSecondLevel> selectAllByUpdateTime(@Param("updateTime") String updateTime);

    void batchInsert(List<CmCustomerSecondLevel> list);

    void updatePaymentDd(String customerId, String organizationId, String channel, Integer paymentDd, String tenantId);

    /**
     * 获取满足时间段最近的一条记录
     *
     * @param tenantId
     * @param customerId
     * @param updateTime
     * @param channels
     * @return
     */
    CmCustomerSecondLevel selectByUpdateTimeAndCustId(@Param("tenantId") String tenantId,
                                                      @Param("customerId") String customerId,
                                                      @Param("updateTime") Date updateTime,
                                                      @Param("channels") List<String> channels);

    /**
     * 根据渠道，租户，账单日或还款日 获取二级信息
     *
     * @param tenantId
     * @param channel
     * @param statementDd
     * @return
     */
    List<CmCustomerSecondLevel> findByChannelAndStatementDdOrPaymentDd(@Param("tenantId") String tenantId,
                                                                       @Param("channel") String channel,
                                                                       @Param("statementDd") Integer statementDd,
                                                                       @Param("paymentDd") Integer paymentDd);

    /**
     * 筛选有推荐人的记录列表
     * @param tenantId
     * @param effectiveDate
     * @param expireDate
     * @return
     */
    List<CmCustomerSecondLevel> selectByRecommenderCodeNotNull(@Param("tenantId") String tenantId,
                                                               @Param("effectiveDate") String effectiveDate,
                                                               @Param("expireDate") String expireDate);

    List<CmCustomerSecondLevel> getSecondByMobileAndTenantId(@Param("mobile") String mobile, @Param("tenantId") String tenantId);

    /**
     * 查询授信和激活时间不在同一天的用户
     * @param tenantId
     * @return
     */
    List<CmCustomerFirstLevel> queryCreditActiveNoteEq( @Param("tenantId") String tenantId);
}


